// 
//  Copyright 2011  reda
// 
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
// 
//        http://www.apache.org/licenses/LICENSE-2.0
// 
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.
using System;
using ManiacMusicManager.Data.Exceptions;
namespace ManiacMusicManager.Data
{
	public partial class SessionManager : IDisposable
	{
		#region Region statique
		private static SessionManager _instance;
		
		/// <summary>
		/// Renvoie un manager de la base de donnée ouverte, si aucune base de donnée n'est ouverte léve une exception
		/// </summary>
		public static SessionManager Manager {
			get {
				if(IsOpened)
					return _instance;
				else
					throw new NoOpenedDatabaseException();
			}
		}
		
		/// <summary>
		/// Ouvre une nouvelle base de données et ferme celle qui est actuellement ouverte
		/// </summary>
		/// <param name="dbFileName">
		/// Fichier base de données
		/// </param>
		public static void Open(string dbFileName) {
			Close();
			_instance	= new SessionManager(dbFileName);
			
		}
		
		/// <summary>
		/// Ferme la base de données actuelle
		/// </summary>
		public static void Close() {
			if(_instance != null) {
				_instance.IsAccessible = false;
			}
			
			_instance	= null;
		}
		
		/// <summary>
		/// Retourne un booléen qui indique si il y a une base de données ouverte
		/// </summary>
		public static bool IsOpened {
			get {
				return (_instance != null) && _instance.IsAccessible;
			}
		}
		#endregion

		#region IDisposable implementation
		/// <summary>
		/// Ferme la base de données et libère la connexion
		/// </summary>
		public void Dispose ()
		{
			try {
				this.Lock();
				this.CloseSession();
				this.Factory.Close();
			}
			finally {
				this.Unlock();
			}
		}
		#endregion

	}
}

